﻿# class CrossEntropyCostFunction(object):
#     pass



import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def cross_entropy_cost_function(X, y, theta):
    """
    计算逻辑回归的交叉熵成本和梯度

    参数:
    X -- 输入特征矩阵，形状为 (m, n)
    y -- 标签向量，形状为 (m,)
    theta -- 参数向量，形状为 (n,)

    返回:
    cost -- 交叉熵成本
    grad -- 相对于参数 theta 的梯度，形状为 (n,)
    """
    m = len(y)  # 样本数量

    # 计算预测值
    h = sigmoid(np.dot(X, theta))

    # 计算交叉熵成本
    epsilon = 1e-5  # 防止 log(0)
    cost = (-1/m) * (np.dot(y, np.log(h + epsilon)) + np.dot((1 - y), np.log(1 - h + epsilon)))

    # 计算梯度
    grad = (1/m) * np.dot(X.T, (h - y))

    return cost, grad

# 示例用法
# 初始化参数
theta = np.zeros(X.shape[1])

# 计算成本和梯度
cost, grad = cross_entropy_cost_function(X, y, theta)
print("Cost:", cost)
print("Gradient:", grad)
